package sys_ctrl

import (
	"ubt-gin-admin/app/api/model/sys_mod"
	"ubt-gin-admin/app/api/service/sys_serv"
	"ubt-gin-admin/app/pkg/enums"
	"ubt-gin-admin/app/pkg/parse"
	"ubt-gin-admin/app/utils"

	"github.com/gin-gonic/gin"
)

type sysTag struct{}

var SysTagCtrl sysTag

// Save 保存标签
func (c *sysTag) Save(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	req := &sys_mod.SysTagSaveReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(ctx, req); err != "" {
		utils.ToJson(ctx, enums.ParamErr.Code, err, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	req.TagId = utils.InputFilter(req.TagId, true)
	req.TagName = utils.InputFilter(req.TagName, true)
	// 判断编码是否重复
	extVo := &sys_mod.SysTagExtVo{TagId: req.TagId, TagName: req.TagName, Kind: req.Kind}
	if ext := sys_serv.SysTagServ.Exists(extVo); ext {
		utils.ToJson(ctx, enums.ExistsErr.Code, enums.ExistsErr.Msg, nil)
		return
	}
	var (
		code string
		msg  string
		kind uint8
	)
	if req.TagId == "" {
		// 新增
		req.TagId = utils.NewNanoid(21)
		code, msg = sys_serv.SysTagServ.Add(req)
		kind = 1
	} else {
		// 修改
		code, msg = sys_serv.SysTagServ.Update(req)
		kind = 3
	}
	if code == enums.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: enums.SysTag, Kind: kind}
		sys_serv.SysLogServ.Add(logReq)
		utils.ToJson(ctx, code, msg, nil)
		return
	}
	utils.ToJson(ctx, code, msg, nil)
}

// Deletes 删除标签
func (c *sysTag) Deletes(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	req := &sys_mod.SysTagProReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(ctx, req); err != "" {
		utils.ToJson(ctx, enums.ParamErr.Code, err, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	req.TagIds = utils.InputFilter(req.TagIds, true)
	code, msg := sys_serv.SysTagServ.Deletes(req.TagIds)
	if code == enums.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: enums.SysTag, Kind: 1}
		sys_serv.SysLogServ.Add(logReq)
		utils.ToJson(ctx, code, msg, nil)
		return
	}
	utils.ToJson(ctx, code, msg, nil)
}

// Page 获取标签分页列表
func (c *sysTag) Page(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	keywords := ctx.Query("keywords")
	kind := ctx.Query("kind")
	limits := ctx.Query("limit")
	offsets := ctx.Query("offset")
	keywords = utils.InputFilter(keywords, false)
	kind = utils.InputFilter(kind, true)
	limits = utils.InputFilter(limits, true)
	offsets = utils.InputFilter(offsets, true)
	limit := parse.Str2u8(limits)
	offset := parse.Str2u32(offsets)
	if kind == "" {
		utils.ToJson(ctx, enums.ParamErr.Code, enums.ParamErr.Msg, nil)
		return
	}
	// 先统计信息的数量
	req := &sys_mod.SysTagPageReq{Keywords: keywords, Kind: kind}
	code, msg, data := sys_serv.SysTagServ.Count(req)
	if code == enums.Succeed.Code {
		res := &sys_mod.SysTagPageRes{Total: data}
		// 再查询具体的信息列表
		req.Limit = limit
		req.Offset = offset
		if code, msg, data = sys_serv.SysTagServ.Page(req); code == enums.Succeed.Code {
			res.List = data
			utils.ToJson(ctx, code, msg, res)
			return
		}
	}
	utils.ToJson(ctx, code, msg, nil)
}

// Add 新增标签
func (c *sysTag) Add(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	req := &sys_mod.SysTagSaveReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(ctx, req); err != "" {
		utils.ToJson(ctx, enums.ParamErr.Code, err, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	req.TagName = utils.InputFilter(req.TagName, true)
	// 判断标签是否存在
	extVo := &sys_mod.SysTagSelReq{TagName: req.TagName, Kind: req.Kind}
	code, msg, data := sys_serv.SysTagServ.Select(extVo)
	if code == enums.ExistsErr.Code {
		req.TagId = utils.NewNanoid(21)
		code, msg = sys_serv.SysTagServ.Add(req)
		if code == enums.Succeed.Code {
			data = &sys_mod.SysTagSelRes{TagId: req.TagId, TagName: req.TagName}
			logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: enums.SysTag, Kind: 1}
			sys_serv.SysLogServ.Add(logReq)
		}
	}
	utils.ToJson(ctx, code, msg, data)
}

// Delete 删除标签
func (c *sysTag) Delete(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	req := &sys_mod.SysTagDelReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(ctx, req); err != "" {
		utils.ToJson(ctx, enums.ParamErr.Code, err, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	req.TagId = utils.InputFilter(req.TagId, true)
	code, msg := sys_serv.SysTagServ.Delete(req.TagId)
	if code == enums.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: enums.SysTag, Kind: 2}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(ctx, code, msg, nil)
}
